package com.yqh.InputStream;

import java.io.FileInputStream;
import java.io.IOException;

/**
 * 字节输入流读数据
 *
 * @author 阳秋豪
 * @createTime 2024/3/7
 */
public class Test1 {
    public static void main(String[] args) throws IOException {
        /*------------------- 字节输入流的细节 -------------------*/
        // 1、创建字节输入流对象
        // -- 如果文件不存在，就直接报错
        // -- Java为什么会这么设计呢?
        //      输出流：不存在，创建文件
        //              把数据写到文件当中
        //      输入流：不存在，直接报错
        //              因为创建出来的文件是没有数据的，没有任何意义。
        //              所以 Java 就没有设计这种无意义的逻辑，文件不存在直接报错
        //      程序中最重要的是：数据。
        // 2、写数据
        // -- 一次读一个字节，读出来的是数据在 ASCII 上对应的数字
        // -- 读到文件末尾了，read 方法返回 -1。
        // 3、释放资源
        // -- 每次使用完流之后都要释放资源

        /*------------------- 字节输入流读数据代码 -------------------*/
        // 1、创建对象
        FileInputStream fis1 = new FileInputStream("c.txt"); // c.txt 内容:abc
        // 2、读取数据
        int read1 = fis1.read();
        int read2 = fis1.read();
        int read3 = fis1.read();
        int read4 = fis1.read();
        System.out.println(read1); // 97
        System.out.println(read2); // 98
        System.out.println(read3); // 99
        System.out.println((char) read1); // a
        System.out.println((char) read2); // b
        System.out.println((char) read3); // c
        System.out.println(read4); // -1 读取不到数据后返回 -1
        // 3、释放资源
        fis1.close();

        /*------------------- 字节输入流读数据的扩展 -------------------*/
        // 1、字符输入流的循环读取
        FileInputStream fis2 = new FileInputStream("c.txt"); // c.txt 内容:abc
        int read;
        while ((read = fis2.read()) != -1) {
            System.out.print((char) read);
        } // abc
        fis2.close();

        System.out.print("\n--------------------\n");

        // 2、一次读取多个字节数组
        FileInputStream fis3 = new FileInputStream("c.txt"); // c.txt 内容:abc
        byte[] bytes = new byte[2];

        int len1 = fis3.read(bytes); // 返回值：本次读取了多少个字节数据
        System.out.println(len1); // 2
        String str = new String(bytes,0, len1);
        System.out.println(str); // ab

        int len2 = fis3.read(bytes);
        System.out.println(len2); // 1
        String str2 = new String(bytes,0,len2);
        System.out.println(str2); // c

    }
}
